package com.chen;

import java.util.List;
import java.util.Scanner;

/**
 * 学生信息管理系统控制类，用于处理用户输入和业务逻辑调用。
 */
public class StudentController implements StudentService {
    // 学生服务接口，实现具体业务逻辑
    private final StudentMapper mapper = new StudentMapperImpl();
    private final Scanner sc; // 控制台输入工具

    /**
     * 默认构造方法，初始化学生服务实现类和控制台输入工具
     */
    public StudentController(Scanner sc) {
        this.sc = sc;
    }

    /**
     * 根据ID查询学生信息功能
     * 提供循环输入机制直到有效ID或用户取消操作
     */
    @Override
    public void getStudentById() {
        while (true) {
            System.out.println("请输入学生ID:");
            int id = getValidStudentId();
            if (id == -1) return;
            else if (id > 0) {
                printStudent(List.of(mapper.getStudentById(id)));
                return;
            }
        }
    }

    /**
     * 打印学生信息列表
     *
     * @param students 学生信息列表
     */
    private void printStudent(List<Student> students) {
        System.out.println("学号\t姓名\t年龄\t地址");
        for (Student s : students) {
            System.out.println(s.getId() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getAddress());
        }
    }

    /**
     * 验证并获取有效的学生ID
     *
     * @return 返回有效的学生ID或操作标识符
     */
    private int getValidStudentId() {
        while (true) {
            int id = sc.nextInt();
            if (!mapper.isStudentExist(id)) {
                System.out.println("没有该学生ID，请重新选择操作");
                System.out.println("1.重新输入学生ID:");
                System.out.println("2.返回上一级菜单:");
                int type = sc.nextInt();
                switch (type) {
                    case 1:
                        return -2;
                    case 2:
                        return -1; // 表示取消操作
                }
            } else {
                return id;
            }
        }
    }

    /**
     * 查询所有学生信息
     */
    @Override
    public void getAllStudent() {
        List<Student> list = mapper.getAllStudent();
        printStudent(list);
    }

    /**
     * 更新学生信息功能
     * 用户可输入新的学生信息进行更新
     */
    @Override
    public void updateStudent() {
        while (true) {
            System.out.println("请输入要修改的学生ID:");
            int id = getValidStudentId();
            if (id == -1) return;
            else if (id > 0) {
                System.out.println("请输入更新后的,姓名，年龄和地址，依次用逗号隔开:");
                String[] info = sc.next().split("[,，]");
                Student student = new Student(id, info[0], Integer.parseInt(info[1]), info[2]);
                State state = mapper.updateStudent(student);
                switch (state) {
                    case SUCCESS:
                        System.out.println("更新成功!");
                        return;
                    case FAILURE:
                        System.out.println("更新失败！");
                        break;
                    case EMPTY:
                        System.out.println("学生列表为空，请添加学生！");
                        return;
                }
            }

        }
    }

    /**
     * 删除学生信息功能
     * 用户输入有效ID后执行删除操作
     */
    @Override
    public void deleteStudent() {
        while (true) {
            System.out.println("请输入要删除的学生ID:");
            int id = getValidStudentId();
            if (id == -1) return;
            else if (id > 0) {
                State state = mapper.deleteStudent(id);
                switch (state) {
                    case SUCCESS:
                        System.out.println("删除成功!");
                        return;
                    case FAILURE:
                        System.out.println("删除失败！");
                        break;
                    case EMPTY:
                        System.out.println("学生列表为空，请添加学生！");
                        return;
                }
            }
        }
    }

    /**
     * 添加学生信息功能
     * 用户输入学生信息进行添加，重复ID会提示重新输入
     */
    @Override
    public void addStudent() {
        while (true) {
            System.out.println("请输入学生ID,姓名，年龄和地址，依次用逗号隔开:");
            String[] info = sc.next().split("[,，]");
            Student student = new Student(Integer.parseInt(info[0]), info[1], Integer.parseInt(info[2]), info[3]);
            if (mapper.addStudent(student)) {
                System.out.println("添加成功!");
                return;
            } else {
                System.out.println("学生ID已存在，请重写输入");
            }
        }
    }
}
